/**
 ******************************************************************************
 * @file           : psv_config.h
 * @brief          : Periodic Signal Validator Configuration
 ******************************************************************************
 * @attention
 *
 * Copyright (c) 2025 PSV Project
 * SPDX-License-Identifier: MIT
 *
 * 周期信号验证器配置文件
 * 所有可配置参数都在这里，方便移植和调整
 *
 ******************************************************************************
 */

#ifndef __PSV_CONFIG_H
#define __PSV_CONFIG_H

/* ============================================================================ */
/*                          依赖配置（移植时修改这里）                            */
/* ============================================================================ */

/**
 * 获取系统时间戳（毫秒）
 * 
 * 移植说明：
 * - STM32 HAL:      HAL_GetTick()
 * - FreeRTOS:       xTaskGetTickCount() * portTICK_PERIOD_MS
 * - Linux:          clock_gettime() / 1000000
 * - Arduino:        millis()
 * - 裸机:           自己实现的ms计数器
 * 
 * 请根据您的平台修改下面的定义：
 */
#define PSV_GET_TICK_MS()       HAL_GetTick()  /* TODO: 修改为您的平台函数 */

/**
 * 数学库配置
 * 
 * 需要以下函数：
 * - sqrtf()  : 平方根
 * - fabsf()  : 绝对值
 * 
 * 如果没有math.h，需要自己实现这两个函数
 */
#include <math.h>
#define PSV_SQRTF(x)            sqrtf(x)
#define PSV_FABSF(x)            fabsf(x)


/* ============================================================================ */
/*                       日志系统配置（改这里的数字）                             */
/* ============================================================================ */

/**
 * 日志后端选择：
 * 0 = 关闭日志（无输出）
 * 1 = 使用 EasyLogger
 * 2 = 使用 printf
 * 3 = 自定义回调函数
 */
#define PSV_USE_LOG             0


/* 根据配置自动定义日志宏 */
#if (PSV_USE_LOG == 1)
    /* 使用EasyLogger */
    #ifndef LOG_TAG
        #define LOG_TAG    "PSV"
    #endif
    #include "elog.h"
    #define PSV_LOG_I(fmt, ...)     log_i(fmt, ##__VA_ARGS__)
    #define PSV_LOG_W(fmt, ...)     log_w(fmt, ##__VA_ARGS__)
    #define PSV_LOG_E(fmt, ...)     log_e(fmt, ##__VA_ARGS__)
    #define PSV_LOG_D(fmt, ...)     log_d(fmt, ##__VA_ARGS__)
    
#elif (PSV_USE_LOG == 2)
    /* 使用printf */
    #include <stdio.h>
    #define PSV_LOG_I(fmt, ...)     printf("[PSV] " fmt "\r\n", ##__VA_ARGS__)
    #define PSV_LOG_W(fmt, ...)     printf("[PSV WARN] " fmt "\r\n", ##__VA_ARGS__)
    #define PSV_LOG_E(fmt, ...)     printf("[PSV ERROR] " fmt "\r\n", ##__VA_ARGS__)
    #define PSV_LOG_D(fmt, ...)     printf("[PSV DEBUG] " fmt "\r\n", ##__VA_ARGS__)
    
#elif (PSV_USE_LOG == 3)
    /* 自定义回调（在psv.c中实现回调注册） */
    extern void psv_log_output(const char *msg);
    #define PSV_LOG_I(fmt, ...)     psv_log_output("[PSV] " fmt)
    #define PSV_LOG_W(fmt, ...)     psv_log_output("[PSV WARN] " fmt)
    #define PSV_LOG_E(fmt, ...)     psv_log_output("[PSV ERROR] " fmt)
    #define PSV_LOG_D(fmt, ...)     psv_log_output("[PSV DEBUG] " fmt)
    
#else
    /* 关闭日志 */
    #define PSV_LOG_I(fmt, ...)
    #define PSV_LOG_W(fmt, ...)
    #define PSV_LOG_E(fmt, ...)
    #define PSV_LOG_D(fmt, ...)
#endif


/* ============================================================================ */
/*                             算法参数配置                                      */
/* ============================================================================ */

/**
 * 功能开关
 * 1 = 启用PSV检测
 * 0 = 禁用（直接返回有效，不进行检测）
 */
#define PSV_ENABLE                      1

/**
 * 频率范围参数
 * 
 * 应用示例：
 * - 涡街流量计: 10-1000Hz
 * - 电机转速:   100-10000Hz
 * - 心率监测:   40-200Hz（换算为BPM: 40-200）
 */
#define PSV_FREQ_MIN_HZ                 10      /*!< 最小有效频率（Hz） */
#define PSV_FREQ_MAX_HZ                 1000    /*!< 最大有效频率（Hz） */

/**
 * 周期检测窗口大小
 * 
 * 说明：连续采集N个周期用于计算变异系数
 * 推荐值：8-16
 * - 太小：统计不稳定
 * - 太大：响应变慢
 */
#define PSV_PERIOD_WINDOW_SIZE          12

/**
 * 周期变异系数阈值（Coefficient of Variation）
 * CV = 标准差 / 均值
 * 
 * 典型值：
 * - 稳定信号: CV < 0.10
 * - 轻微波动: CV = 0.10 ~ 0.15
 * - 明显波动: CV = 0.15 ~ 0.25
 * - 干扰信号: CV > 0.30
 * 
 * 调整建议：
 * - 高稳定性要求: 0.10
 * - 标准应用:     0.15
 * - 波动较大流量: 0.20 ~ 0.25
 */
#define PSV_PERIOD_CV_THRESHOLD         0.15f

/**
 * 频率变化率限制（Hz/s）
 * 
 * 说明：限制频率变化的速度，防止突然跳变
 * 
 * 应用示例：
 * - 流量计（慢速）:  50 ~ 100 Hz/s
 * - 电机转速（快速）: 500 ~ 1000 Hz/s
 */
#define PSV_FREQ_CHANGE_RATE_MAX_HZ_S   100.0f

/**
 * 连续稳定次数要求
 * 
 * 说明：必须连续N次检测通过才认为信号有效
 * 推荐值：2-5
 * - 降低：响应快，但可能误通过
 * - 提高：抗干扰强，但响应慢
 */
#define PSV_STABLE_COUNT_MIN            3


/* ============================================================================ */
/*                          高级配置（一般不需要改）                              */
/* ============================================================================ */

/**
 * NULL指针定义
 * 如果编译器没有定义NULL，取消下面的注释
 */
// #ifndef NULL
// #define NULL ((void *)0)
// #endif

/**
 * 内存操作函数
 * 默认使用标准库的memset，如果没有可以自己实现
 */
#include <string.h>
#define PSV_MEMSET(ptr, val, size)      memset(ptr, val, size)


#endif /* __PSV_CONFIG_H */
